package embedding;

import java.util.List;
import java.util.concurrent.CompletableFuture;

/**
 * 嵌入向量生成器抽象基类
 */
public abstract class Embedding {
    protected int maxTokens;

    /**
     * 预处理文本，确保其适合嵌入
     * 
     * @param text 输入文本
     * @return 处理后的文本
     */
    protected String preprocessText(String text) {
        // 替换空字符串为单个空格
        if (text == null || text.isEmpty()) {
            return " ";
        }

        // 简单的基于字符的截断（近似）
        // 英文文本中每个标记大约是 4 个字符
        int maxChars = this.maxTokens * 4;
        if (text.length() > maxChars) {
            return text.substring(0, maxChars);
        }

        return text;
    }

    /**
     * 预处理文本数组
     * 
     * @param texts 输入文本数组
     * @return 处理后的文本数组
     */
    protected List<String> preprocessTexts(List<String> texts) {
        return texts.stream()
                .map(this::preprocessText)
                .toList();
    }

    /**
     * 生成文本嵌入向量
     * 
     * @param text 文本内容
     * @return 嵌入向量
     */
    public abstract CompletableFuture<EmbeddingVector> embed(String text);

    /**
     * 批量生成文本嵌入向量
     * 
     * @param texts 文本数组
     * @return 嵌入向量数组
     */
    public abstract CompletableFuture<List<EmbeddingVector>> embedBatch(List<String> texts);

    /**
     * 获取嵌入向量维度
     * 
     * @return 向量维度
     */
    public abstract int getDimension();

    /**
     * 获取服务提供商名称
     * 
     * @return 提供商名称
     */
    public abstract String getProvider();
}